package es.us.isg2;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import es.us.isg2.database.JDBCFacade;

public class TipoDePregunta {
	/**
	 * @uml.property  name="tipo"
	 */
	String tipo;
	/**
	 * @uml.property  name="colPreguntas"
	 */
	ArrayList<Pregunta> colPreguntas;
	/**
	 * @uml.property  name="facade"
	 * @uml.associationEnd  multiplicity="(1 1)"
	 */
	JDBCFacade facade;
	
	public TipoDePregunta(String tipo) {
		this.tipo = tipo;
		this.colPreguntas = new ArrayList<Pregunta>();
		facade = new JDBCFacade();
		facade.connect("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Preguntas");
	}
	
	/**
	 * @return
	 * @uml.property  name="tipo"
	 */
	public String getTipo () {
		return tipo;
	}
	
		@Override
	protected void finalize() throws Throwable {
		facade.disconnect();
		super.finalize();
	}

	public Pregunta getPreguntaAlAzar() {
		double semilla = Math.random();
		int numeroDePreguntas = getNumPreguntas();
		int indicePregunta;
		Pregunta res = null;
		while (res == null && numeroDePreguntas > 0) {
			indicePregunta = (int) (numeroDePreguntas * semilla) + 1;
			res = createPregunta(indicePregunta);
		}
		return res;
	}
	
	private Pregunta createPregunta(int indice) {
		String query = "SELECT * FROM Preguntas WHERE TipoDePregunta='" + tipo;
		query += "' AND IDPregunta=" + indice + "";
		Iterator<Map<String,Object>> itm = facade.executeQuery(query);

		Pregunta res = null;
		String textoPregunta = "";
		int indiceCorrecta = -1;
		if (itm.hasNext()) {
			Map<String,Object> mapPregunta = itm.next();
			textoPregunta = (String)mapPregunta.get("TextoPregunta");
			indiceCorrecta = (Integer)mapPregunta.get("RespuestaCorrecta");
		}
		
		query = "SELECT IDRespuesta,TextoRespuesta FROM Respuestas WHERE TipoDePregunta='" + tipo;
		query += "' AND IDPregunta=" + indice + " ORDER BY IDRespuesta";
		Iterator<Map<String,Object>> itr = facade.executeQuery(query);
		List<String> respuestas = new LinkedList<String>();
		while (itr.hasNext()) {
			Map<String,Object> mapRespuesta = itr.next();
			String respuesta = mapRespuesta.get("TextoRespuesta").toString();
			respuestas.add(respuesta);
		}
		
		res = new Pregunta(textoPregunta,respuestas,indiceCorrecta);
		
		return res;
	}
	
	private int getNumPreguntas() {
		String query = "SELECT COUNT(*) AS numPreguntas FROM Preguntas WHERE TipoDePregunta='" + tipo +"'";
		Iterator<Map<String,Object>> itm = facade.executeQuery(query);

		int res = 0;
		if (itm.hasNext()) {
			res = (Integer)itm.next().get("numPreguntas");
		}
		
		return res;
	}

	@Override
	public String toString() {
		return tipo;
	}
	
	
}
